#pragma once

#include <iostream>
using namespace std;

//#include "Sort.h"		// cai loi chet tiet nay lam ton 3g 

//
//#ifdef USE_EXPORT_KEYWORD
// export
//#endif

//----------------------------------------MyArray.h----------------------------------------//

template <class T>
class MyArray
{
private:
	T *m_pElement;
	int m_iSize;
	//Sort * m_pSort;
public:
	//==========================================
	// NHOM HAM KHOI TAO
	//==========================================

	MyArray(int size)
	{
		m_iSize = size;
		m_pElement = new T[m_iSize];
		//m_pSort = NULL;
	};

	MyArray()
	{
		m_iSize = 0;
		m_pElement = NULL;
		//m_pSort = NULL;
	};

	~MyArray()
	{
		delete[] m_pElement;
	};

	//==========================================
	// NHOM HAM TOAN TU
	//==========================================

	MyArray& operator = (const MyArray& arr)
	{
		m_iSize = arr.m_iSize;
		m_pElement = new T[m_iSize];

		for (int i = 0; i < m_iSize; i++)
			m_pElement[i] = arr.m_pElement[i];

		return (*this);
	};

	T& operator [] (int index)
	{
		return m_pElement[index];
		//return ((*this).m_pElement[index]);
	};

	//==========================================
	// NHOM HAM XU LY NGHIEP VU
	//==========================================

	// dua 1 phan tu vao mang
	bool Push(T element);

	// Xoa 1 phan tu tai 1 vi tri
	bool Delete(int index);

	// Chem 1 phan tu tu vi tri index
	bool Insert(T Element, int index);

	// Lay so luong phan tu cua mang
	int Count();

 	// tim kiem vi tri 1 phan tu 
	int GetFirstPosition(T element);

	// Dinh nghia ham sap xep
	// ...
	
};


//----------------------------------------MyArray.cpp----------------------------------------//


// dua 1 phan tu vao mang
template <class T>
bool MyArray<T>::Push(T element)
{
	T* tempArr;
	tempArr = new T[m_iSize + 1];
	
	// Sao Chep mang phan tu this sang mang tempArr
	for (int i = 0; i < m_iSize; i++)
		tempArr[i] = m_pElement[i];

	tempArr[m_iSize] = element;	// phan tu cuoi cung la phan tu moi them vao

	delete[] m_pElement;	// Huy mang phan tu cua this

	m_pElement = tempArr;	// this tro sang dia chi mang moi (tempArr)
	m_iSize++;	

	return true;
};

// Xoa 1 phan tu tai 1 vi tri
template <class T>
bool MyArray<T>::Delete(int index)
{
	if (index < 0 || index >= m_iSize)
		return false;

	for (int i = index; i < m_iSize - 1; i++)
		m_pElement[i] = m_pElement[i + 1];

	m_iSize--;

	return true;
};

// Chem 1 phan tu tu vi tri index
template <class T>
bool MyArray<T>::Insert(T element, int index)
{
	if (index < 0 || index > m_iSize)
		return false;

	T *tempArr = new T[m_iSize + 1];

	// Copy cac phan tu truoc index
	for (int i = 0; i < index; i++)
		tempArr[i] = m_pElement[i];

	// Chen phan tu truoc index
	tempArr[index] = element;

	// Copy cac phan tu sau index
	for (int i = index + 1; i < m_iSize + 1; i++)
		tempArr[i] = m_pElement[i - 1];

	delete[] m_pElement;	// Xoa vung nho con tro this
	
	m_pElement = tempArr;	// gan con tro tro toi dia chi mang moi (tempArr)
	m_iSize++;

	return true;
};

// Lay so luong phan tu cua mang
template <class T>
int MyArray<T>::Count()
{
	/*int count = 0;

	while (m_pElement[count] != NULL)
		count++;*/

	return m_iSize;
};

// tim kiem vi tri 1 phan tu 
template <class T>
int MyArray<T>::GetFirstPosition(T element)
{
	for (int i = 0; i < m_iSize; i++)
		if (m_pElement[i] == element)
			return i;
	
	return -1;
};